/**
 * {作业名称}
 *
 * 输入参数:
 *
 * 输出参数:
 *
 */
(() => {
  // 私有区域

  return function ({ UID, Records }) {
    // 验证输入参数
    if (!UID) throw Error("无效会话");

    // 处理逻辑
    A.db.trans('MP', conn => {
      // 加载调拨单明细
      const { Rows } = A.job.CardR(UID, 'ST.调拨单明细', ['调拨单', '调拨单.单号', '调拨单.调出仓库', '调拨单.调入仓库', '品规', '品规.名称', '品规.商品.名称', '数量'],
        [['调拨单', 'in', Records.map(r => r.ID)]]);
      if (Rows.length === 0) throw Error("没有选中的调拨单明细");

      Rows.forEach(r => {
        Rows[r.调拨单] = Rows[r.调拨单] ?? { 总数量: 0 };
        Rows[r.调拨单].总数量 += r.数量;

        // 加载可用的台账批次
        const { Rows: store_list } = A.job.CardR(UID, 'ST.库存台账', null, {
          Filter: [['仓库', '=', r['调拨单.调出仓库']], ['品规', '=', r.品规], ['余量', '>', 0]],
          Order: { '生产日期': 'asc', '数量': 'asc' },
        });
        const total = store_list.reduce((acc, cur) => acc + cur.余量, 0);
        if (total < r.数量) throw Error(`${r['品规.商品.名称']}规格为${r['品规.名称']}的库存数量不足`);

        let waiting = r.数量;
        const results = [];
        store_list.every(store => {
          if (store.余量 >= waiting) {
            results.push({ ID: store.ID, '生产日期': store.生产日期, '数量': waiting, '单价': store.单价, 金额: waiting * store.单价 });
            waiting = 0;
            return false;
          } else {
            results.push({ ID: store.ID, '生产日期': store.生产日期, '数量': store.余量, '单价': store.单价, 金额: store.余量 * store.单价 });
            waiting -= store.余量;
            return true;
          }
        });
        // 调出仓出库
        A.job.CardW(UID, 'ST.库存台账', null, results.map(res => ({
          '仓库': r['调拨单.调出仓库'],
          '品规': r.品规,
          '生产日期': res.生产日期,
          '数量': 0 - res.数量,
          '余量': 0,
          '单价': res.单价,
          '金额': res.金额,
          '摘要': '调拨:' + r['调拨单.单号'],
          '上级': res.ID,
        })));
        // 调入仓入库
        A.job.CardW(UID, 'ST.库存台账', null, results.map(res => ({
          '仓库': r['调拨单.调入仓库'],
          '品规': r.品规,
          '生产日期': res.生产日期,
          '数量': res.数量,
          '余量': res.数量,
          '单价': res.单价,
          '金额': 0 - res.金额,
          '摘要': '调拨:' + r['调拨单.单号'],
        })));
        // 更新余量
        const ids = results.map(res => res.ID);
        A.db.execute('MP', `UPDATE ST_KCTZ A SET A.YL = (SELECT A.SL + SUM(B.SL) FROM (SELECT SJ_ID, SL FROM ST_KCTZ) B WHERE B.SJ_ID=A.ID) WHERE A.ID IN (${ids.map(id => '?').join(',')})`, ids);
      });

      // 更新调拨单状态
      A.job.CardW(UID, 'ST.调拨单', null, Records.map(r => ({
        'ID': r.ID,
        '总数量': Rows[r.ID].总数量,
        '调拨日期': new Date(),
      })));
    });

    // 返回结果
    return true;
  };
})()